From b6c23c86fe5a1a027d9e173d9cba7e89c8eb2d67 Mon Sep 17 00:00:00 2001 From: Marek Marczykowski Date: Tue, 21 Jun 2011 17:50:47 +0100 Subject: [PATCH] libxl: add all pci devices to xenstore at once (during VM create) When adding pci devices one by one, pciback notice only the first one. For every next, "state" is left as is (usualy "4" in that time), so backend will not rescan xenstore. So when VM is starting all devices should be added at once and then backend can initialize it. This applies only to pci, because only pci backend have one xenstore dir for multiple devices. Signed-off-by: Marek Marczykowski Signed-off-by: Ian Jackson Committed-by: Ian Jackson --- tools/libxl/libxl_create.c | 8 ++++++++ tools/libxl/libxl_internal.h | 2 ++ tools/libxl/libxl_pci.c | 8 ++++++-- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/tools/libxl/libxl_create.c b/tools/libxl/libxl_create.c index 91e2414f7e..1b7fd61034 100644 --- a/tools/libxl/libxl_create.c +++ b/tools/libxl/libxl_create.c @@ -525,6 +525,14 @@ static int do_domain_create(libxl__gc *gc, libxl_domain_config *d_config, for (i = 0; i < d_config->num_pcidevs; i++) libxl__device_pci_add(gc, domid, &d_config->pcidevs[i], 1); + ret = libxl__create_pci_backend(gc, domid, d_config->pcidevs, + d_config->num_pcidevs); + if (ret < 0) { + LIBXL__LOG(ctx, LIBXL__LOG_ERROR, + "libxl_create_pci_backend failed: %d", ret); + goto error_out; + } + if (!d_config->c_info.hvm && d_config->b_info.u.pv.e820_host) { int rc; rc = libxl__e820_alloc(ctx, domid, d_config); diff --git a/tools/libxl/libxl_internal.h b/tools/libxl/libxl_internal.h index 3d3bf52f0c..49665b891a 100644 --- a/tools/libxl/libxl_internal.h +++ b/tools/libxl/libxl_internal.h @@ -226,6 +226,8 @@ _hidden int libxl__wait_for_backend(libxl__gc *gc, char *be_path, char *state); /* from libxl_pci */ _hidden int libxl__device_pci_add(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int starting); +_hidden int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, + libxl_device_pci *pcidev, int num); /* xl_exec */ diff --git a/tools/libxl/libxl_pci.c b/tools/libxl/libxl_pci.c index 307ca2376b..8d2c4d19a3 100644 --- a/tools/libxl/libxl_pci.c +++ b/tools/libxl/libxl_pci.c @@ -221,7 +221,8 @@ static void libxl_create_pci_backend_device(libxl__gc *gc, flexarray_t *back, in flexarray_append_pair(back, libxl__sprintf(gc, "state-%d", num), libxl__sprintf(gc, "%d", 1)); } -static int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, libxl_device_pci *pcidev, int num) +int libxl__create_pci_backend(libxl__gc *gc, uint32_t domid, + libxl_device_pci *pcidev, int num) { libxl_ctx *ctx = libxl__gc_owner(gc); flexarray_t *front = NULL; @@ -707,7 +708,10 @@ out: } } - rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting); + if (!starting) + rc = libxl__device_pci_add_xenstore(gc, domid, pcidev, starting); + else + rc = 0; return rc; } -- 2.30.2